#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORTNUM 8000

int main(int argc,char *argv[],char *envp[]){
   
   struct sockaddr_in dest; /* socket info about the machine connecting to us */
   struct sockaddr_in serv; /* socket info about our server */
   int mysocket;            /* socket used to listen for incoming connections */
   int socksize = sizeof(struct sockaddr_in);

   memset(&serv, 0, sizeof(serv));    /* zero the struct before filling the fields */
   serv.sin_family = AF_INET;         /* set the type of connection to TCP/IP */
   serv.sin_addr.s_addr = INADDR_ANY; /* set our address to any interface */
   serv.sin_port = htons(PORTNUM);    /* set the server port number */    

   mysocket = socket(AF_INET, SOCK_STREAM, 0);

   /* bind serv information to mysocket */
   bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr));

   /* start listening, allowing a queue of up to 1 pending connection */
   listen(mysocket, 1);
   int node_id=0;
   while(1){
         int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
         node_id=fork();
         if(node_id==0){
            while(consocket)
            {

               //printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr));
               char msg[255];
               char buffer[120];
               int len=0;
               len = recv(consocket, buffer,120 , 0);
               if(len<=0)
                  break;
               if(len>1){
                  buffer[len]='\0';
                  sprintf(msg,"--Received--\n%s\nEnd(%d bytes).\n", buffer, len);
                  printf("%s",buffer);
                  send(consocket, msg, strlen(msg), 0); 
               }else{
                  //len==1 
                  printf("(NULL)");
               }
            }
            close(consocket);
         }
   }

   close(mysocket);
}
